package ufs.dcomp.mgemeos.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import ufs.dcomp.mgemeos.perfis.Participante;

/**
 *
 * @author Luiz Marcus
 * @modificacao 04/02/2011
 */
public class ParticipanteDAO implements interface_dao.IParticipante {

    private static String inserir = "insert into participante (nome, cpf, email, dt_nascimento, sexo, endereco, cidade, estado,"
            + "cep, telefone, celular, login, senha, confirmado, idEvento) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    private static String atualizar = "update participante set nome =?, cpf=?, email=?, dt_nascimento=?, sexo=?, endereco=?, cidade=?, estado=?,"
            + "cep=?, telefone=?, celular=?, login=?, senha=?, idEvento=? where idParticipante=?";  
    private static String atualizar_status = "update participante set confirmado=? where idParticipante=?";
    private static String obter = "select * from participante where idParticipante = ? ORDER BY nome";
    private static String obter_por_login = "select * from participante where login = ? ";
    private static String obter_todos = "select * from participante ORDER BY nome";
    private static String delete = "delete from participante where idParticipante = ? ";

    @Override
    public boolean atualizarParticipante(Participante participante) {
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(atualizar);
            pst.setString(1, participante.getNome());
            pst.setString(2, participante.getCpf());
            pst.setString(3, participante.getEmail());
            try {
                pst.setDate(4, formataData(participante.getData_nascimento()));
            } catch (Exception ex) {
                Logger.getLogger(ParticipanteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            pst.setString(5, participante.getSexo());
            pst.setString(6, participante.getEndereco());
            pst.setString(7, participante.getCidade());
            pst.setString(8, participante.getEstado());
            pst.setString(9, participante.getCep());
            pst.setString(10, participante.getTelefone());
            pst.setString(11, participante.getCelular());
            pst.setString(12, participante.getLogin());
            pst.setString(13, participante.getSenha());
            pst.setInt(14, participante.getIdEvento());
            pst.setInt(15, participante.getIdParticipante());
            pst.executeUpdate();
            pst.close();
            con.close();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    @Override
    public boolean atualizarStatus(int id, boolean status){
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(atualizar_status);

            pst.setBoolean(1, status);
            pst.setInt(2, id);
            pst.executeUpdate();
            pst.close();
            con.close();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public Participante obterParticipante(int id) {
        Participante participante = null;
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(obter);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {

                participante = new Participante();
                participante.setIdParticipante(rs.getInt(1));
                participante.setNome(rs.getString(2));
                participante.setCpf(rs.getString(3));
                participante.setEmail(rs.getString(4));
                participante.setData_nascimento(rs.getDate(5).toString());
                participante.setSexo(rs.getString(6));
                participante.setEndereco(rs.getString(7));
                participante.setCidade(rs.getString(8));
                participante.setEstado(rs.getString(9));
                participante.setCep(rs.getString(10));
                participante.setTelefone(rs.getString(11));
                participante.setCelular(rs.getString(12));
                participante.setLogin(rs.getString(13));
                participante.setSenha(rs.getString(14));
                participante.setConfirmado(rs.getBoolean(15));
                participante.setIdEvento(rs.getInt(16));

            }
            rs.close();
            pst.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return participante;
    }

    @Override
    public Participante obterParticipante_por_Login(String login) {
        Participante participante = null;
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(obter_por_login);
            pst.setString(1, login);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {

                participante = new Participante();
                participante.setIdParticipante(rs.getInt(1));
                participante.setNome(rs.getString(2));
                participante.setCpf(rs.getString(3));
                participante.setEmail(rs.getString(4));
                participante.setData_nascimento(rs.getDate(5).toString());
                participante.setSexo(rs.getString(6));
                participante.setEndereco(rs.getString(7));
                participante.setCidade(rs.getString(8));
                participante.setEstado(rs.getString(9));
                participante.setCep(rs.getString(10));
                participante.setTelefone(rs.getString(11));
                participante.setCelular(rs.getString(12));
                participante.setLogin(rs.getString(13));
                participante.setSenha(rs.getString(14));
                participante.setConfirmado(rs.getBoolean(15));
                participante.setIdEvento(rs.getInt(16));
            }
            rs.close();
            pst.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return participante;
    }

    @Override
    public boolean inserirParticipante(Participante participante) {
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        System.out.println(participante.getNome());
        Participante participante2 = obterParticipante_por_Login(participante.getLogin());

        if (participante2 == null) {
            try {
                pst = con.prepareStatement(inserir);
                pst.setString(1, participante.getNome());
                pst.setString(2, participante.getCpf());
                pst.setString(3, participante.getEmail());
                try {
                    pst.setDate(4, formataData(participante.getData_nascimento()));
                } catch (Exception ex) {
                    Logger.getLogger(ParticipanteDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
                pst.setString(5, participante.getSexo());
                pst.setString(6, participante.getEndereco());
                pst.setString(7, participante.getCidade());
                pst.setString(8, participante.getEstado());
                pst.setString(9, participante.getCep());
                pst.setString(10, participante.getTelefone());
                pst.setString(11, participante.getCelular());
                pst.setString(12, participante.getLogin());
                pst.setString(13, participante.getSenha());
                pst.setBoolean(14, false);//O status inicial de confirmação no evento é sempre falso.
                pst.setInt(15, participante.getIdEvento());
                pst.execute();
                pst.close();
                con.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public boolean deletar(int id) {
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;

        Participante participante2 = obterParticipante(id);

        if (participante2 != null) {
            try {
                pst = con.prepareStatement(delete);
                pst.setInt(1, id);
                pst.execute();
                pst.close();
                con.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public ArrayList<Participante> obter_todos() {
        Participante participante = null;
        ArrayList<Participante> lista_participantes = new ArrayList<Participante>();
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(obter_todos);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {

                participante = new Participante();
                participante.setIdParticipante(rs.getInt(1));
                participante.setNome(rs.getString(2));
                participante.setCpf(rs.getString(3));
                participante.setEmail(rs.getString(4));
                participante.setData_nascimento(rs.getDate(5).toString());
                participante.setSexo(rs.getString(6));
                participante.setEndereco(rs.getString(7));
                participante.setCidade(rs.getString(8));
                participante.setEstado(rs.getString(9));
                participante.setCep(rs.getString(10));
                participante.setTelefone(rs.getString(11));
                participante.setCelular(rs.getString(12));
                participante.setLogin(rs.getString(13));
                participante.setSenha(rs.getString(14));
                participante.setConfirmado(rs.getBoolean(15));
                participante.setIdEvento(rs.getInt(16));

                lista_participantes.add(participante);
            }
            rs.close();
            pst.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return lista_participantes;
    }

    
    public java.sql.Date formataData(String data) throws Exception {
        if (data == null || data.equals("")) {
            return null;
        }

        java.sql.Date date = null;
        try {
            DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            date = new java.sql.Date(((java.util.Date) formatter.parse(data)).getTime());
        } catch (ParseException e) {
            throw e;
        }
        return date;
    }

    
}
